package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法，关键字：abstract
 * 类：只能提供行为概念,没有具体实现行为
 *
 *
 * 抽象类与面向对象--多态绝对关系
 * 使用多态创建抽象类对象，抽象类本身无法创建对象，需要使用多态完成抽象类创建
 *
 * 什么是使用抽象类？
 * 复杂项目时，需要在不同类下实现不同的功能，首先抽象类
 *
 * 定义抽象类与抽象方法？
 * 抽象类：修饰符   abstract   class   类名{}    ---毫无意义，必须结合抽象方法
 *抽象方法：修饰符  abstract 返回值    方法名（参数）；---没有具体实现行为
 *
 * 抽象类”实例化：创建对象“：抽象类自身无法实例化
 * ①创建【N个】子类：继承抽象【父】类；于是一定实现抽象【父】类的所有抽象与方法
 * ②使用面向对象：多态【向上造型】   抽象类  引用=new   【实现】子类（）;
 * 注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫做”实现类“！
 */
abstract class Animals{   //抽象类
  //抽象方法:没有具体实现【代码块】----一定是继承的---一定多态性【造型】
    public abstract void say();
    //①定义由final修饰的抽象方法   ?    X
   // public final abstract void sleep ();
    //②定义抽象变量    ？   X
   // abstract int i=1;
    //③定义静态变量  ?     V
    static int i=1;
    //④定义静态抽象变量   ？     X
    //static abstract int j=1;
    //⑤定义静态抽象方法【无实现】    ?   X
   // public static abstract void eat();
    //⑥定义静态的方法【无实现:要代码块】
    public  static  void eat(){};

    //⑤⑥总结：抽象方法|静态方法，方法定义：修饰符  static和abstract二选一
    //⑦可以定义内部类：静态内部类  ?    V
    static class Sos{}
    //⑧抽象类有构造器吗？  V
    public Animals(){

    }
    //⑨抽象类普通实现方法？   V
    public void run(){}


}
//抽象类可以继承抽象类吗？  V          实现：两个抽象类--形容---一个实现
abstract class Thing extends Animals{
    public abstract void sleep();
}
//目的：两个抽象类中所有的抽象方法---继承【子】抽象类

//实现类：实现抽象【父】类的方法----多个实现类---继承---抽象
class Person1 extends Animals{  //报错原因：完成重写

    public void say() {
        System.out.println("人---说话---");
    }


}

public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法实现类:提供抽象方法--必须有子类实现---多态【造型】
        Animals a=new Person1() ;
        a.say();//向上造型---重写抽象父类的抽象方法

    }

}
